﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Financeiro.Dados;
using System.Data;
using System.Globalization;

namespace Financeiro.Model
{
    public class HoleriteModel
    {

        #region Fields

        private int codigo;
        private int mes;
        private int ano;

        #endregion

        #region Properties

        public int Codigo
        {
            get { return codigo; }
            set { codigo = value; }
        }

        public int Mes
        {
            get { return mes; }
            set { mes = value; }
        }

        public int Ano
        {
            get { return ano; }
            set { ano = value; }
        }

        #endregion

        #region Constructors

        public HoleriteModel()
        {}

        public HoleriteModel(int codigo, int mes, int ano)
        {
            this.codigo = codigo;
            this.mes = mes;
            this.ano = ano;
        }

        #endregion

        #region Method

        public DataTable buscarPagamentosFuncionario()
        {
            DataTable dt = FolhaPagamentoDAO.buscarPagamentosFuncionario(Codigo, Mes, Ano);

            // houve pagamentos a esse funcionário neste período
            if (dt != null)
            {
                DataRow dr =  dt.Rows[0];
                CultureInfo culture = new CultureInfo("pt-BR");

                string nome = dr[1].ToString();
                double valorHora = Convert.ToDouble(dr[2].ToString(),culture);
                double valorHoraExtra = Convert.ToDouble(dr[3].ToString(), culture);
                double horasTrabalhadas = Convert.ToDouble(dr[4].ToString(), culture);
                double horasExtra = Convert.ToDouble(dr[5].ToString(), culture);
                double salario = Math.Round(valorHora * horasTrabalhadas, 2);
                double salarioExtra = Math.Round(valorHoraExtra * horasExtra, 2);
                double beneficios = 0.0;          

                // Criamos os dados para serem exibidos na lista
                DataTable pagamentos = new DataTable();
                pagamentos.Columns.Add("Descricao");
                
                         

                double total = Math.Round(salario + salarioExtra);

                // impostos
                ImpostosFolhaPagamento impostos = new ImpostosFolhaPagamento(total);
                double INSS = impostos.valorINSS();
                double IR = impostos.valorIR();
   
 
                DataRow rowSalario = pagamentos.NewRow();
                rowSalario["Descricao"] = String.Format("Salário: {0:F2} Horas x R${1:F2} = R${2:F2}", horasTrabalhadas, valorHora, salario);
                pagamentos.Rows.Add(rowSalario);

                DataRow rowSalarioExtra = pagamentos.NewRow();
                rowSalarioExtra["Descricao"] = String.Format("Horas Extras: {0:F2} Horas x R${1:F2} = R${2:F2}", horasExtra, valorHoraExtra, salarioExtra);
                pagamentos.Rows.Add(rowSalarioExtra);


                DataRow rowLinha1 = pagamentos.NewRow();
                rowLinha1["Descricao"] = String.Format("---------------Benefícios------------------");
                pagamentos.Rows.Add(rowLinha1);

                // acessa os beneficios
                DataTable dtBeneficios = FolhaPagamentoDAO.buscarBeneficios(Codigo, Mes, Ano);

                foreach (DataRow drBeneficios in dtBeneficios.Rows)
                {
                    beneficios += Convert.ToDouble(drBeneficios["Valor"], culture);

                    DataRow row = pagamentos.NewRow();
                    row["Descricao"] = String.Format("{0}: {1:c}", drBeneficios["Nome"].ToString(), Convert.ToDouble(drBeneficios["Valor"],culture));
                    pagamentos.Rows.Add(row);
    
                }


                DataRow rowLinha = pagamentos.NewRow();
                rowLinha["Descricao"] = String.Format("-----------------------------------------------");
                pagamentos.Rows.Add(rowLinha);

                DataRow rowBruto = pagamentos.NewRow();
                rowBruto["Descricao"] = String.Format("Salario Bruto: R${0:F2}", total);
                pagamentos.Rows.Add(rowBruto);

                DataRow rowINSS = pagamentos.NewRow();
                rowINSS["Descricao"] = String.Format("INSS: R${0:F2}", INSS);
                pagamentos.Rows.Add(rowINSS);

                DataRow rowIR = pagamentos.NewRow();
                rowIR["Descricao"] = String.Format("IR: R${0:F2}", IR);
                pagamentos.Rows.Add(rowIR);


                DataRow rowLinha2 = pagamentos.NewRow();
                rowLinha2["Descricao"] = String.Format("-----------------------------------------------");
                pagamentos.Rows.Add(rowLinha2);

                DataRow rowLiquido = pagamentos.NewRow();
                rowLiquido["Descricao"] = String.Format("Salário Líquido: R${0:F2}", total - INSS - IR);
                pagamentos.Rows.Add(rowLiquido);

                DataRow rowDescBeneficios = pagamentos.NewRow();
                rowDescBeneficios["Descricao"] = String.Format("Benefícios: R${0:F2}", beneficios);
                pagamentos.Rows.Add(rowDescBeneficios);


                DataRow totalImpostos = pagamentos.NewRow();
                totalImpostos["Descricao"] = String.Format("Impostos: R${0:F2}", INSS + IR);
                pagamentos.Rows.Add(totalImpostos);


                return pagamentos;
            }

            return null;

        }
        #endregion

        #region Static Methods
        // função que acessa o nome dos funcionarios 
        static public DataTable buscarNome(string nome)
        {
            return HoleriteDAO.buscarNome(nome);
        }

        static public DataTable buscarDadosFuncionario(int codigo)
        {
            return HoleriteDAO.buscarDadosFuncionario(codigo);
        }
        #endregion

    }
}
